package sim_moteur.factory;

import sim_moteur.Coordonnee;
import sim_moteur.Terrain;
import sim_moteur.element.Chose;
import util.SimProperties;

public class AbstractFactory {

	protected SimProperties properties = SimProperties.getInstance();

	public final static String X_SUFFIX_NAME = ".initial.position.x";
	public final static String Y_SUFFIX_NAME = ".initial.position.y";

	public final static String VEGETAUX_PROPERTY_NAME = "simulation.vegetaux.nombre";
	public final static String ANIMAUX_PROPERTY_NAME = "simulation.animal.nombre";
	public final static String CHOSE_PROPERTY_NAME = "simulation.chose.nombre";

	protected int nombre = 0;

	protected int nombreAnimauxMax;
	protected int nombreVegetauxMax;
	protected int nombreChoseMax;

	private String prefix;

	AbstractFactory(String simPrefix) {
		nombreAnimauxMax = properties.getIntProperty(simPrefix + "."
				+ ANIMAUX_PROPERTY_NAME);
		nombreVegetauxMax = properties.getIntProperty(simPrefix + "."
				+ VEGETAUX_PROPERTY_NAME);
		nombreChoseMax = properties.getIntProperty(simPrefix + "."
				+ CHOSE_PROPERTY_NAME);
		this.prefix = simPrefix;
	}

	/**
	 * Place l'élément au bon endroit en respectant ce qui est indiqué dans le
	 * fichier de propriétés.
	 * 
	 * @param chose
	 *            la chose à placée
	 */
	protected <T extends Chose> void place(T chose) {
		String nom = chose.getName();
		int x = properties.getIntProperty(prefix +"."+ nom + ".initial.position.x");
		int y = properties.getIntProperty(prefix +"."+ nom + ".initial.position.y");
		Coordonnee coordonneeSouhaitee = new Coordonnee(x, y);
		Terrain terrain = Terrain.getInstance();
		if (terrain.estPlacable(chose, coordonneeSouhaitee)) {
			terrain.place(chose, coordonneeSouhaitee);
		} else if(x>=0 && y>=0){
			chose.setCoordonnees(coordonneeSouhaitee);
			Coordonnee nouvelleCoordonnee = terrain.trouveUnePlacePresDe(chose);
			if (nouvelleCoordonnee != null) {
				chose.setCoordonnees(nouvelleCoordonnee);
			} else {
				terrain.trouveUnePlaceAletoire(chose);
			}
		}else {
			terrain.trouveUnePlaceAletoire(chose);
		}
		
	}

	protected String getPrefix() {
		return prefix;
	}

}
